<?php
namespace app\wap\logic;

use think\Db;
use think\Cache;
use think\Image;
use think\Validate;
use app\wap\model\WxNews;
use app\wap\model\WxReply;
use app\wap\model\WxTplMsg;
use app\wap\model\WxKeyword;
use app\wap\model\WxMaterial;
use app\wap\logic\wechat\WechatUtil;

/**
 * 微信公众号的业务逻辑类
 */
class WechatLogic
{
    static private $wx_user = null;
    static private $wechat_obj;

    public function __construct($config = null)
    {
        if (!self::$wx_user) {
            if ($config === null) {
                $config = db('wx_user')->find();
            }
            self::$wx_user = $config;
            self::$wechat_obj = new WechatUtil(self::$wx_user);
        }
    }
    /**
     * 处理接收推送消息
     */
    public function handleMessage()
    {
        self::$wechat_obj->registerMsgEvent(WechatUtil::EVENT_TEXT, function ($msg) {
            $this->handleTextMsg($msg);
        });
//
//        self::$wechat_obj->registerMsgEvent(WechatUtil::EVENT_CLICK, function ($msg) {
//            $this->handleClickEvent($msg);
//        });

        self::$wechat_obj->registerMsgEvent(WechatUtil::EVENT_SUBSCRIBE, function ($msg) {
            $this->handleSubscribeEvent($msg);
        });

//        self::$wechat_obj->registerMsgEvent(WechatUtil::EVENT_SCAN, function ($msg) {
//            $this->handleSubscribeScanEvent($msg);
//        });

        self::$wechat_obj->handleMsgEvent();
    }
    /**
     * 处理关注事件
     * @param array $msg
     * @return array
     */
    private function handleSubscribeEvent($msg)
    {
        $openid = $msg['FromUserName'];
        if (!$openid) {
            exit("openid无效");
        }
        if ($msg['MsgType'] != 'event' || $msg['Event'] != 'subscribe') {
            $this->replyError($msg , "不是关注事件");
        }
        if (!db('user')->where('openid', $openid)->find()) {
            if (false === ($wxdata = self::$wechat_obj->getFanInfo($openid))) {
                $this->replyError($msg , self::$wechat_obj->getError());
            }
            /* $wxdata[]元素：
             * subscribe	用户是否订阅该公众号标识，值为0时，代表此用户没有关注该公众号，拉取不到其余信息。
             * openid	用户的标识，对当前公众号唯一
             * nickname	用户的昵称
             * sex	用户的性别，值为1时是男性，值为2时是女性，值为0时是未知
             * city	用户所在城市
             * country	用户所在国家
             * province	用户所在省份
             * language	用户的语言，简体中文为zh_CN
             * headimgurl	用户头像，最后一个数值代表正方形头像大小（有0、46、64、96、132数值可选，0代表640*640正方形头像），用户没有头像时该项为空。若用户更换头像，原有头像URL将失效。
             * subscribe_time	用户关注时间，为时间戳。如果用户曾多次关注，则取最后关注时间
             * unionid	只有在用户将公众号绑定到微信开放平台帐号后，才会出现该字段。
             * remark	公众号运营者对粉丝的备注，公众号运营者可在微信公众平台用户管理界面对粉丝添加备注
             * groupid	用户所在的分组ID（兼容旧的用户分组接口）
             * tagid_list	用户被打上的标签ID列表
             */
            $userData = [
                'openid'  => $openid,
                'unionid'  => $wxdata['unionid'],
                'avatarUrl'  => $wxdata['headimgurl'],
                'country'  => $wxdata['country'],
                'province'  => $wxdata['province'],
                'subscribe_time'  => $wxdata['subscribe_time'],
                'subscribe'  => $wxdata['subscribe'],
                'city'  => $wxdata['city'],
                'wxapp_id'  => 10001,
                'nickName'  => $wxdata['nickname'] ?: '微信用户',
                'gender'       => $wxdata['sex'] ?: 0,
                'create_time'  => time(),
                'update_time'  => time(),
            ];
            $userId = db('user')->insert($userData,false,true);
            //查询线下支付用户信息表
            $usersPayInfo = db('user_pay')->where('openid',$openid)->find();
            if(empty($usersPayInfo)){
                //不存在
                $payData['userid'] = $userId;
                $payData['openid'] = $openid;
                $payData['points'] = 0;
                $payData['create_time'] = time();
                $payData['update_time'] = time();
                db('user_pay')->insert($userData,false,true);
            }else{
                //已存在  修改userid
                db('user_pay')->where('id',$usersPayInfo['id'])->update(['userid'=>$userId,'update_time'=>time()]);
                //修改user表中的用户积分
                db('user')->where('user_id',$userId)->setInc('points',$usersPayInfo['points']);
                //修改积分记录的userid字段
                db('user_points_log')->where('user_pay_id',$usersPayInfo['id'])->update(['user_id'=>$userId]);
                //修改线下支付订单表userid字段
                db('pay_order')->where('user_pay_id',$usersPayInfo['id'])->update(['user_id'=>$userId]);
            }
        }
        $this->replySubscribe($msg['ToUserName'], $openid);
    }
    /**
     * 处理点击推送事件
     * @param array $msg
     */
    private function handleTextMsg($msg)
    {
        $from = $msg['ToUserName'];
        $to = $msg['FromUserName'];
        $keyword = trim($msg['Content']);
        if($keyword) {
            $str = $keyword;
        }else {
            $str = "欢迎关注【随官屯宜品购】\n您获得的积分可以在\"宜品到家\"中当钱花\n赶快体验吧！！！" . $keyword;
        }
        $resultStr = self::$wechat_obj->createReplyMsgOfText($from, $to, $str);
        exit($resultStr);
    }
    /**
     * 关注时回复消息
     */
    private function replySubscribe($from, $to)
    {
//        $result_str = $this->createReplyMsg($from, $to, WxReply::TYPE_FOLLOW);
//        if ( ! $result_str) {
//            //没有设置关注回复，则默认回复如下：
//            $store_name = tpCache("shop_info.store_name");
//            $result_str = self::$wechat_obj->createReplyMsgOfText($from, $to, "欢迎来到 $store_name !\n商城入口：".SITE_URL.'/mobile');
//        }
        $result_str = self::$wechat_obj->createReplyMsgOfText($from, $to, "欢迎关注【随官屯宜品购】\n您获得的积分可以在\"宜品到家\"中当钱花\n赶快体验吧！！！");
        exit($result_str);
    }
    /**
     * 默认回复
     * @param array $msg
     */
//    private function replyDefault($from, $to)
//    {
//        $resultStr = $this->createReplyMsg($from, $to, WxReply::TYPE_DEFAULT);
//        if ( ! $resultStr) {
//            //没有设置默认回复，则默认回复如下：
//            $store_name = tpCache("shop_info.store_name");
//            $resultStr = self::$wechat_obj->createReplyMsgOfText($from, $to, "欢迎来到 $store_name !");
//        }
//
//        exit($resultStr);
//    }
    /**
     * 创建回复消息
     * @param $from string 发送方
     * @param $to string 被发送方
     * @param $type string WxReply的类型
     * @param array $data 附加数据
     * @return string
     */
//    private function createReplyMsg($from, $to, $type, $data = [])
//    {
//        if ($type != WxReply::TYPE_KEYWORD) {
//            $reply = WxReply::get(['type' => $type]);
//        } else {
//            $wx_keyword = WxKeyword::get(['keyword' => $data['keyword'], 'type' => WxKeyword::TYPE_AUTO_REPLY], 'wxReply');
//            $wx_keyword && $reply = $wx_keyword->wx_reply;
//        }
//
//        if (empty($reply)) {
//            return '';
//        }
//
//        $resultStr = '';
//        if ($reply->msg_type == WxReply::MSG_TEXT && $reply['data']) {
//            $resultStr = self::$wechat_obj->createReplyMsgOfText($from, $to, $reply['data']);
//        } elseif ($reply->msg_type == WxReply::MSG_NEWS) {
//            $resultStr = $this->createNewsReplyMsg($from, $to, $reply->material_id);
//        } else {
//            //扩展其他类型，如image，voice等
//        }
//
//        return $resultStr;
//    }
}